그래프를 그리기 위해서 matplotlib
을 임포트 합니다. %matplotlib inline
은 새로운 창을 띄우지 않고 주피터 노트북 안에 이미지를 삽입하여 줍니다.
In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline
텐서플로우에는 이진분류를 위한 데이터셋이 없어 사이킷런의 데이터셋을 이용합니다. 그리고 입력 데이터를 저장할 넘파이 배열을위해 넘파이 패키지를 임포트합니다. 마지막으로 텐서플로우를 임포트합니다.
from sklearn import datasets
import numpy as np
....
In [ ]:
sklearn.datasets
밑에 있는 load_breast_cancer()
함수를 사용해 위스콘신 유방암 데이터를 로드합니다.
cancer = datasets.load_breast_cancer()
In [ ]:
cancer.feature_names
의 길이를 확인해 보세요. 특성이 총 몇개인가요.
In [ ]:
cancer.feature_names
를 출력해 보세요. 특성이 어떤 종류의 데이터인지 가늠해 볼 수 있습니다.
In [ ]:
cancer.feature_names
이 데이터셋은 악성이 1, 양성이 0인 이진 분류의 문제입니다. 따라서 타겟 값은 1 또는 0 으로 되어 있습니다. cancer.target
에서 100~110 번째 데이터를 한번 확인해 보세요. 다른 위치의 데이터를 확인해도 됩니다.
cancer.target[100:110]
In [ ]:
cancer.data
가 샘플 데이터 x 이고, cancer.target
이 정답 y 입니다. 이 두 데이터는 모두 넘파이 배열로 되어 있습니다. 넘파이 배열에는 shape
속성이 있어서 배열의 차원을 알 수 있습니다. 두 변수의 차원을 확인해 보세요.
cancer.data.shape, ...
In [ ]:
cancer.data
와 cancer.target
은 넘파이 배열로 float64
값을 가집니다. 텐서플로우에서는 특별한 경우를 제외하고 성능을 위해서 float32
를 기본으로 합니다. 그래서 이 두 넘파이 배열을 float32
로 바꾸도록 하겠습니다.
그리고 cancer.target
은 1차원 배열이므로 2차원 구조로 변경하여 569개의 행을 가지고 1나의 행을 가지도록 변경하겠습니다.
x = cancer.data.astype('...')
y = cancer.target.astype('...').reshape(..., 1)
In [ ]:
x = ...
y = ...
이제 x 와 y 의 차원을 다시 확인해 보세요.
In [ ]:
데이터 x 와 곱해질 가중치 W 변수를 만듭니다. 이 변수는 특성의 개수만큼 크기를 가집니다. x 의 한 행마다 곱해져야 하므로 W는 열벡터로 만들어야 합니다.
W = tf.Variable(tf.zeros([.., ..]))
편향 값 b 는 한개만 있어도 됩니다.
b = tf.Variable(tf.zeros([.]))
이제 x 와 W 를 곱하면 됩니다. 선형 회귀 때와는 달리 행렬곱을 위해 tf.matmul()
함수를 사용합니다.
y_hat = tf.matmul(x, W) + b
In [ ]:
W = ...
b = ...
y_hat = ...
시그모이드 크로스 엔트로피 손실 함수는 tf.losses.sigmoid_cross_entropy()
에 정의되어 있습니다. 경사하강법 최적화 셋팅은 선형회귀 때와 동일합니다. 학습 속도를 0.00001 로 해보세요. 그리고 나중에 학습 속도를 바꾸어서 다시 테스트해 보세요.
In [ ]:
loss = tf.losses.sigmoid_cross_entropy(.., ..)
optimizer = ...
train = ...
세션 객체를 생성하고 변수를 초기화 합니다.
In [ ]:
init = ...
sess = ...
sess.run(init)
sess.run()
으로 학습 노드 train
과 손실 loss
를 실행하세요.
In [ ]:
costs = []
for step in range(5000):
_, c = sess.run([.., ..])
costs.append(c)
예측 결과를 보려면 선형 계산인 y_hat에 시그모이드 함수를 적용해야 합니다. 텐서플로우에는 tf.sigmoid()
함수가 있습니다. 리턴된 결과는 569개의 샘플에 대한 예측 결과를 담고 있는 넘파이 배열입니다.
prediction = sess.run(tf.sigmoid(y_hat))
이 배열에서 0.5 이상인 값들은 악성(1)으로 구분하고 나머지는 양성(0)으로 만듭니다. 그리고 원본 타깃값 y 와 비교하겠습니다.
accuracy = (prediction > 0.5) == y
In [ ]:
prediction = ...
accuracy = ...
np.sum()
함수는 배열의 값을 모두 더합니다. True/False 로 되어 있는 배열에 적용하면 True인 갯수를 헤아리는 효과가 됩니다. 그런 다음 전체 샘플 개수로 나누면 정확히 예측한 비율을 얻을 수 있습니다.
np.sum(accuracy)/len(y)
In [ ]:
np.sum(...)/len(.)
손실 함수에서 리턴된 값이 들어가 있는 costs 리스트로 그래프를 그려 보세요.
In [ ]:
plt.plot(...)